﻿//1297. 子串的最大出现次数
//给你一个字符串 s ，请你返回满足以下条件且出现次数最大的 任意 子串的出现次数：
//子串中不同字母的数目必须小于等于 maxLetters 。
//子串的长度必须大于等于 minSize 且小于等于 maxSize 。


class Solution {
public:
    unordered_map<string, int> table;
    unordered_map<char, int> word;
    int M = 0;
    bool check()
    {
        return word.size() <= M;
    }

    int maxFreq(string s, int maxLetters, int minSize, int maxSize)
    {
        M = maxLetters;
        int k = minSize;
        for (int i = 0; i < k; i++)
        {
            word[s[i]]++;
        }
        if (check()) table[s.substr(0, k)]++;
        for (int i = 1; i <= s.size() - k; i++)
        {
            word[s[i - 1]]--;
            if (word[s[i - 1]] == 0)  word.erase(s[i - 1]);
            word[s[i + k - 1]]++;
            if (check()) table[s.substr(i, k)]++;
        }
        int ret = 0;
        for (auto& e : table)
        {
            ret = max(e.second, ret);
        }
        return ret;
    }
};